#!/usr/bin/env python3
"""
增强版多模型管理功能演示脚本
展示改进后的模型管理器、模型评估器和智能模型选择器功能
包括性能评估、缓存优化和监控集成
"""

import asyncio
import time
import logging
from src.research_core.model_manager import ModelManager, ModelType
from src.research_core.model_evaluator import ModelEvaluator
from src.research_core.intelligent_model_selector import IntelligentModelSelector
from src.research_core.model_monitoring import model_monitoring


# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


async def demo_enhanced_model_manager():
    """演示增强版模型管理器功能"""
    print("=== 增强版模型管理器功能演示 ===")
    
    # 获取模型管理器实例
    manager = ModelManager()
    
    # 列出所有可用模型
    print("1. 可用模型列表:")
    models = manager.list_models()
    for model_type, model_name in models.items():
        status = "可用" if model_name != "Unavailable" else "不可用"
        print(f"   {model_type.value}: {model_name} ({status})")
    
    # 演示带监控的模型调用
    print("\n2. 带监控的模型调用:")
    try:
        result = manager.invoke_model_with_monitoring(
            ModelType.CHAT, 
            "简单回答：什么是人工智能？"
        )
        print(f"   调用成功，结果类型: {type(result).__name__}")
    except Exception as e:
        print(f"   调用出错: {e}")
        # 演示容错机制 - 尝试获取不可用的模型
        print("   演示容错机制...")
        # 这里我们模拟一个不存在的模型类型来测试容错
        # 在实际应用中，这种容错会在模型初始化失败时触发


def demo_enhanced_model_evaluator():
    """演示增强版模型评估器功能"""
    print("\n=== 增强版模型评估器功能演示 ===")
    
    # 创建模型评估器
    evaluator = ModelEvaluator()
    
    # 模拟评估几个模型的性能
    print("1. 真实模型性能评估:")
    
    # 获取真实模型进行评估
    manager = ModelManager()
    chat_model = manager.get_model(ModelType.CHAT)
    
    if chat_model:
        # 评估聊天模型
        print("   评估聊天模型...")
        performance = evaluator.evaluate_model_performance(
            chat_model,
            "问答任务",
            "什么是机器学习？"
        )
        print(f"   Chat模型性能 - 响应时间: {performance.get_average_response_time():.2f}s, "
              f"准确率: {performance.get_average_accuracy():.2f}, 错误率: {performance.get_error_rate():.2f}")
    else:
        print("   聊天模型不可用，跳过评估")
    
    # 根据不同需求选择最佳模型（带缓存）
    print("\n2. 带缓存的模型选择:")
    
    # 高准确率优先的任务
    high_accuracy_req = {
        "time_weight": 0.2,
        "accuracy_weight": 0.7,
        "error_weight": 0.1
    }
    
    # 第一次选择
    start_time = time.time()
    best_model_1 = evaluator.select_best_model("code_task", high_accuracy_req)
    time_1 = time.time() - start_time
    
    # 第二次选择（应该使用缓存）
    start_time = time.time()
    best_model_2 = evaluator.select_best_model("code_task", high_accuracy_req)
    time_2 = time.time() - start_time
    
    print(f"   第一次选择: {best_model_1} (耗时: {time_1*1000:.2f}ms)")
    print(f"   第二次选择: {best_model_2} (耗时: {time_2*1000:.2f}ms)")
    print(f"   缓存效果: {('命中' if time_2 < time_1 else '未命中') if best_model_1 == best_model_2 else '不同结果'}")


def demo_enhanced_intelligent_model_selector():
    """演示增强版智能模型选择器功能"""
    print("\n=== 增强版智能模型选择器功能演示 ===")
    
    # 创建智能模型选择器
    selector = IntelligentModelSelector()
    
    print("1. 多次模型选择以收集指标:")
    
    # 执行多次选择以收集指标
    for i in range(3):
        model = selector.select_model_for_task(
            f"task_type_{i%2}", 
            f"任务描述 {i}",
            {
                "time_weight": 0.4,
                "accuracy_weight": 0.5,
                "error_weight": 0.1
            }
        )
        print(f"   选择 {i+1}: {type(model).__name__ if model else 'None'}")
    
    # 显示选择指标
    print("\n2. 模型选择指标:")
    metrics = selector.get_selection_metrics()
    print(f"   总选择次数: {metrics['total_selection_calls']}")
    print(f"   平均选择时间: {metrics['average_selection_time']*1000:.2f}ms")
    print(f"   模型选择计数: {metrics['model_selection_count']}")
    
    # 显示模型性能报告
    print("\n3. 模型性能报告:")
    report = selector.get_model_performance_report()
    if report:
        for model_name, performance in report.items():
            print(f"   {model_name}:")
            print(f"     平均响应时间: {performance['avg_response_time']:.2f}s")
            print(f"     平均准确率: {performance['avg_accuracy']:.2f}")
            print(f"     错误率: {performance['error_rate']:.2f}")
            print(f"     评估次数: {performance['evaluations_count']}")
    else:
        print("   暂无性能报告")


def demo_monitoring_integration():
    """演示监控集成功能"""
    print("\n=== 监控集成功能演示 ===")
    
    print("1. 监控指标信息:")
    metrics = model_monitoring.get_metrics()
    for metric_name, metric_info in metrics.items():
        print(f"   {metric_name}: {metric_info}")
    
    print("\n2. 模拟监控记录:")
    # 模拟一些监控记录
    model_monitoring.record_model_call("ChatOpenAI", "chat")
    model_monitoring.record_model_response_time("ChatOpenAI", "chat", 0.5)
    model_monitoring.record_model_accuracy("ChatOpenAI", "chat", 0.95)
    model_monitoring.record_model_error_rate("ChatOpenAI", "chat", 0.02)
    model_monitoring.record_model_selection("qa_task", "ChatOpenAI", 0.01)
    
    print("   已记录模拟监控数据")


def demo_fault_tolerance():
    """演示容错机制"""
    print("\n=== 容错机制演示 ===")
    
    # 创建模型管理器
    manager = ModelManager()
    
    # 尝试获取所有类型的模型
    print("1. 模型可用性检查:")
    for model_type in ModelType:
        model = manager.get_model(model_type)
        status = "可用" if model else "不可用"
        model_name = manager.model_names.get(model_type, "Unknown")
        print(f"   {model_type.value}: {model_name} ({status})")
    
    print("\n2. 模型调用容错演示:")
    # 尝试调用模型（即使某些模型可能不可用）
    try:
        result = manager.invoke_model_with_monitoring(ModelType.CHAT, "你好，世界！")
        print(f"   聊天模型调用成功: {type(result).__name__}")
    except Exception as e:
        print(f"   聊天模型调用失败: {e}")
    
    # 尝试调用可能不可用的模型
    try:
        # 这里我们尝试调用一个可能初始化失败的模型
        # 实际应用中，这种容错会在模型初始化失败时自动触发
        print("   模型回退机制会在内部自动处理")
    except Exception as e:
        print(f"   模型调用出错: {e}")


async def main():
    """主演示函数"""
    print("增强版多模型管理功能演示")
    print("=" * 50)
    
    # 演示增强版模型管理器
    await demo_enhanced_model_manager()
    
    # 演示增强版模型评估器
    demo_enhanced_model_evaluator()
    
    # 演示增强版智能模型选择器
    demo_enhanced_intelligent_model_selector()
    
    # 演示监控集成
    demo_monitoring_integration()
    
    # 演示容错机制
    demo_fault_tolerance()
    
    print("\n" + "=" * 50)
    print("增强版演示完成!")


if __name__ == "__main__":
    asyncio.run(main())